/*
 * Allwinner SoCs display driver.
 *
 * Copyright (C) 2016 Allwinner.
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2.  This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */

/* ********************************************************************************************************************* */
/* All Winner Tech, All Right Reserved. 2014-2015 Copyright (c) */
/*  */
/* File name   :   de_lti_type.h */
/*  */
/* Description :   display engine 2.0 lti struct declaration */
/*  */
/* History     :   2014/04/01  vito cheng  v0.1  Initial version */
/*  */
/* ********************************************************************************************************************* */

#ifndef __DE_LTI_TYPE_H__
#define __DE_LTI_TYPE_H__

#include "de_rtmx.h"

#define LTI_PARA_NUM 1
#define LTI_MODE_NUM 2

typedef union {
	unsigned int dwval;
	struct {
		unsigned int en				   :  1;    /* Default: 0x0; */
		unsigned int res0              :  7;    /* Default: ; */
		unsigned int sel			   :  1;    /* Default: 0x0; */
		unsigned int res1              :  7;    /* Default: ; */
		unsigned int nonl_en		   :  1;    /* Default: 0x0; */
		unsigned int res2              :  7;    /* Default: ; */
		unsigned int win_en			   :  1;    /* Default: 0x0; */
		unsigned int res3              :  7;    /* Default: ; */

	} bits;
} LTI_EN;

typedef union {
	unsigned int dwval;
	struct {
		unsigned int width				:  12;    /* Default: 0x0; */
		unsigned int res0				:  4;    /* Default:; */
		unsigned int height				:  12;    /* Default: 0x0; */
		unsigned int res1				:  4;    /* Default:; */
	} bits;
} LTI_SIZE;

typedef union {
	unsigned int dwval;
	struct {
		unsigned int c0			        :  8;    /* Default: 0x0; */
		unsigned int res0               :  8;	  /* Default:; */
		unsigned int c1			        :  8;    /* Default: 0x0; */
		unsigned int res1               :  8;	  /* Default:; */
	} bits;
} LTI_FIR_COFF0;
typedef union {
	unsigned int dwval;
	struct {
		unsigned int c2			        :  8;    /* Default: 0x0; */
		unsigned int res0               :  8;	  /* Default:; */
		unsigned int c3			        :  8;    /* Default: 0x0; */
		unsigned int res1               :  8;	  /* Default:; */
	} bits;
} LTI_FIR_COFF1;
typedef union {
	unsigned int dwval;
	struct {
		unsigned int c4			        :  8;    /* Default: 0x0; */
		unsigned int res0               :  24;	  /* Default:; */
	} bits;
} LTI_FIR_COFF2;

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lti_fil_gain       :  4;	   /* Default: 0x0; */
		unsigned int res0				:  28;     /* Default:; */

	} bits;
} LTI_FIR_GAIN;

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lti_cor_th			:  10;	   /* Default: 0x0; */
		unsigned int res0				:  22;     /* Default:; */
	} bits;
} LTI_COR_TH;

typedef union {
	unsigned int dwval;
	struct {
		unsigned int offset				:  8;	   /* Default: 0x0; */
		unsigned int res0				:  8;     /* Default:; */
		unsigned int slope				:  5;	   /* Default: 0x0; */
		unsigned int res1				:  11;     /* Default:; */
	} bits;
} LTI_DIFF_CTL;

typedef union {
	unsigned int dwval;
	struct {
		unsigned int edge_gain			:  5;	   /* Default: 0x0; */
		unsigned int res0				:  27;     /* Default: ; */
	} bits;
} LTI_EDGE_GAIN;


typedef union {
	unsigned int dwval;
	struct {
		unsigned int core_x				:  8;	   /* Default: 0x0; */
		unsigned int res0				:  8;     /* Default: ; */
		unsigned int clip				:  8;	   /* Default: 0x0; */
		unsigned int res1				:  4;     /* Default: ; */
		unsigned int peak_limit			:  3;	   /* Default: 0x0; */
		unsigned int res2				:  1;     /* Default: ; */
	} bits;
} LTI_OS_CON;

typedef union {
	unsigned int dwval;
	struct {
		unsigned int win_range			:  8;	   /* Default: 0x0; */
		unsigned int res0				:  24;     /* Default: ; */
	} bits;
} LTI_WIN_EXPANSION;

typedef union {
	unsigned int dwval;
	struct {
		unsigned int elvel_th			:  8;	   /* Default: 0x0; */
		unsigned int res0				:  24;     /* Default: ; */
	} bits;
} LTI_EDGE_ELVEL_TH;

typedef union {
unsigned int dwval;
	struct {
		unsigned int win_left			:  12;    /* Default: 0x0; */
		unsigned int res0               :  4;	  /* Default:; */
		unsigned int win_top			:  12;    /* Default: 0x0; */
		unsigned int res1               :  4;	  /* Default:; */
	} bits;
} LTI_WIN0_REG;

typedef union {
	unsigned int dwval;
	struct {
		unsigned int win_right			:  12;    /* Default: 0x0; */
		unsigned int res0               :  4;	  /* Default:; */
		unsigned int win_bot			:  12;    /* Default: 0x0; */
		unsigned int res1               :  4;	  /* Default:; */
	} bits;
} LTI_WIN1_REG;

typedef struct {
	LTI_EN			    ctrl;	/* 0x0000 */
	unsigned int		res0[2];    /* 0x0004-0x0008 */
	LTI_SIZE			size;	/* 0x000c */
	LTI_FIR_COFF0       coef0;   /* 0x0010 */
	LTI_FIR_COFF1       coef1;   /* 0x0014 */
	LTI_FIR_COFF2       coef2;   /* 0x0018 */
	LTI_FIR_GAIN        gain;   /* 0x001c */
	LTI_COR_TH          corth;   /* 0x0020 */
	LTI_DIFF_CTL        diff;   /* 0x0024 */
	LTI_EDGE_GAIN       edge_gain;   /* 0x0028 */
	LTI_OS_CON          os_con;   /* 0x002c */
	LTI_WIN_EXPANSION   win_range;   /* 0x0030 */
	LTI_EDGE_ELVEL_TH   elvel_th;   /* 0x0034 */
	LTI_WIN0_REG		win0;   /* 0x0038 */
	LTI_WIN1_REG		win1;   /* 0x003c */
} __lti_reg_t;

typedef struct {
	/* lti */
	unsigned int lti_en;
	unsigned int gain;

	/* window */
	unsigned int win_en;
	de_rect win;

} __lti_config_data;

#endif
